package someTestExcemple.huaweiOd.doublepointer;
import java.util.*;
//https://blog.csdn.net/guorui_java/article/details/133062757
//华为OD机试 - 求最多可以派出多少支团队 - 双指针（Java 2025 A卷 100分）


/**
 * 一、题目描述
 * 用数组代表每个人的能力。一个比赛活动要求参赛团队的最低能力值为N，每个团队可以由一人或者两人组成，且一个人只能参加一个团队，计算出最多可以派出多少只符合要求的队伍。
 *
 * 二、输入描述
 * 第一行代表总人数，范围1-500000
 *
 * 第二行数组代表每个人的能力数组大小，范围1-500000。元素取值，范围1-500000
 *
 * 第三行数值为团队要求的最低能力值，范围1-500000
 *
 * 三、输出描述
 * 最多可以派出的团队数量。
 */

/**
 * 贪心-->尽量试一下能力小的能不能组队
 * 思路：贪心+双指针
 *  首先，将每个人的能力值进行排序，然后使用双指针分别指向数组的开头和结尾。
 *  接着，根据题目要求的团队最低能力值，从两端向中间逼近，不断组成团队，直到两指针相遇。
 * 具体实现步骤如下：
 * 将每个人的能力值数组进行排序。
 * 初始化团队数量为0。
 * 使用两个指针l和r分别指向数组的开头和结尾。
 * 不断判断当前指向的两个人的能力值之和是否大于等于团队要求的最低能力值，如果是，则这两个人可以组成一个团队，
 * 团队数量加1，同时将指针向中间移动；
 * 如果不是，抛弃左值，左指针向中间移动。
 * 重复步骤，直到两个指针相遇。
 * 最终，团队数量即为所求结果。
 *
 * 作者：code5bug
 * 链接：https://www.nowcoder.com/discuss/606229388694155264?sourceSSR=search
 * 来源：牛客网
 */
public class TeamAssign {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //todo 经典输入输出格式问题，牢记
/*        int n = sc.nextInt();
        System.out.println(n);
        int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();*/
        //上面这么写就会报错
        //应为：输入格式问题：sc.nextLine() 读取的是上一次调用 sc.nextInt() 后遗留的换行符，而不是用户输入的整数数组。
        int n = Integer.parseInt(sc.nextLine());
        int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
        int minTarget = sc.nextInt();
        sc.close();
        List<Integer> list = new ArrayList<>();
        for(int i=0;i<arr.length;i++) {
            list.add(arr[i]);
        }
        //按能力由小到大排序
        list.sort((o1, o2) -> o1 - o2);

        System.out.println(teamAssignNum(list,minTarget));
    }

    public static int teamAssignNum(List<Integer> list,int minTarget) {
        int l=0,r=list.size()-1;
        int total =0;
        while(l<=r) {
            //两个if的顺序不能乱
            if(list.get(r) >= minTarget) {
                total++;
                r--;
            } else if((l!= r) && (list.get(l) + list.get(r) >= minTarget)) {
                total++;
                r--;
                l++;
            } else {
                //两个人组不了一对，或者l=r时候，剩下这个人也组不了一对
                l++;
            }
        }
        return total;
    }
}
